#Demo4.ps1
#Mise en place d'un FileAppender en tant qu'appender par d?faut.
#Ajout et suppression de filtres sur un appender

.\InitializeLG4N.ps1 

function TestLevel{
 Write-host "Level $($Log.Logger.Level)" -for green
 $Log.Debug("Level Debug.")
 $Log.Info("Level Info.")
 $Log.Warn("Level Warn.")
 $Log.Error("Level Error.")
 $Log.Fatal("Level Fatal.")
}

$FileName="C:\Temp\LogDemo4.txt"
#$FileName="?:\Temp\LogDemo4.txt" #Test sur 1 cdrom ou un drive en R/O

$Header="En-t?te de page[DEBUT SESSION]`r`n"
 #Les champs Header et Footer ne sont pris en compte qu'en mode AppendToFile
 #Les champs Header et Footer sont pris en compte lors du d?marrage d'une journalisation.
 #Ils ne sont pas affich?s pour chaque ?v?nement. 
$Appender=New-LogFileAppender $FileName -n "FichierDeLog" -AppendToFile|`
   #Les champs Footer et Header sont g?r?s par ce type d'appender
 Add-LogLayout -L "%date %-5level - %message%newline" -F "Pied de page.[FIN SESSION]`r`n" -H $Header|`
 Enable-LogAppender|`
 Set-LogBasicConfigurator

if ($Appender.Writer -eq $null)
     #Si on ne dispose pas de droit d'?criture ou si le drive est en R/O 
     # un message d'erreur est affich? sur la console. Le script continue mais la propri?t? Writer est ? $null.  
  {Write-Warning "L'appender $Name n'est peut ?tre pas correctement configur? pour le fichier $Filename"}

 
$Log = Get-LogLogger "LogPowerShell" 
Testlevel
gc $FileName
 
 #On n'utilise pas l'objet renvoy? par le pipeline
 #Void ne renvoi pas l'appender r?mit par Log???Filter
 #Dans ce cas les traces de Write-Debug ne sont plus affich?es
function AddFiltres{
$Appender|`
 Update-LogLayout -L "%date{dd-MM-yyyy } %-5level - %message%newline"|`
 Add-LogRangeFilter -Min Warn -Max Critical|`
 Add-LogStringFilter -MatchStr "Test"|`
 Add-LogDenyAllFilter|`
 Enable-LogAppender
}
AddFiltres
Testlevel 
gc $FileName
  #!!!!! ATTENTION : sur un FileAppender existant l'appel suivant efface le fichier
  # puisque par d?faut le mode AppendToFile est ? $False
 $Appender.ActivateOptions() 
gc $FileName

 #Affiche le liste des filtres. 
 #Pour le dernier (DenyAllFilter) une ligne vide est affich?e car il ne contient aucune propri?t?. 
$Appender|Get-LogFilters
$Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}

$DebugPreference="continue"
$Appender|Get-LogFilters|% {$_.Gettype()}







#!!!!!!!!!!!! Suppression d'un seul filtre !!!!!!!!!!!

 # Supprime le premier filtre r?pondant aux crit?res de s?lection contenus dans un scriptblock
 # $CurrentFilter est une variable interne ? la fonction Remove-LogFilters et 
 # elle r?f?rence le filtre courant lors du parcourt de la liste chain?e. 
 #
 #Le scriptblock re?oit dans $args l'appender courant
$Appender|Remove-LogFilters -S { $CurrentFilter -is [log4net.Filter.LevelRangeFilter]}
$Appender|Get-LogFilters|% {$_.Gettype()}
$Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}

$Appender|Remove-LogFilters -S { Write-Warning "Appender.name= $($Args[0].Name)"; $CurrentFilter -is [log4net.Filter.LevelRangeFilter]}

#!!!!!!!!!!!! Suppression de multiple filtres de type identique !!!!!!!!!!!

 #Duplique les filtres
AddFiltres
 # Supprime tous les premier filtre r?pondant aux crit?res de s?lection contenus dans un scriptblock
$Appender|Remove-LogFilters -All -S { $CurrentFilter -is [log4net.Filter.StringMatchFilter]}
$Appender|Get-LogFilters|% {$_.Gettype()}
$Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}

 #Supprime tous les filtres
$Appender.ClearFilters()


#!!!!!!!!!!!! Suppression de filtres de type diff?rent  !!!!!!!!!!!

 #Duplique les filtres
AddFiltres
$Appender|Get-LogFilters|% {$_.Gettype()}
$Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}

 # Supprime tous les premier filtre r?pondant aux crit?res de s?lection contenus dans un scriptblock
$Appender|Remove-LogFilters -All -S {( ($CurrentFilter -is [log4net.Filter.StringMatchFilter]) -or                                   
                                  ($CurrentFilter -is [log4net.Filter.LevelRangeFilter])
                               )}
$Appender|Get-LogFilters|% {$_.Gettype()}
$Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}


 #Arr?te le Framework et ferme proprement le fichier de log
Stop-Log
del $FileName
#Le fichier peut exceptionnellement rester lock? un court instant, dans ce cas faire
#[GC]::Collect([GC]::MaxGeneration)
#Del $FileName

